<?php
require_once ('External/simple_html_dom.php');

/**
 * Cette classe permet de traiter la question poser par l'utilisateur
 * @author KPC & Ferrage
 *
 */
class Moteur {

	/**
	 * Soumet au site www.trueknowledge.com la question,
	 * Soustret la partie des réponses du site
	 * Retourne les réponses si il y en a, sinon null
	 * @param $url
	 */
	public static function getAnswerDiv($url) {
		$content = Moteur::http_fetch_url ( $url );
		$id = 'tk_answer_main';
		$idEnd = 'knowledge_stats';
		if (strpos ( $content, $id ) !== false) {
			$startPos = strpos ( $content, $id ) - 9;
			$endPos = strpos ( $content, $idEnd, $startPos ) - 9;
			$answerDiv = substr ( $content, $startPos, ($endPos - $startPos) );
			return $answerDiv;
		}
		return null;
	}
	
	/**
	 * Permet de récupérer le lien wikipédia dans la langue voulue
	 * si ce lien existe
	 * @param $url
	 * @param $to
	 */
	public static function getWikiLinkTranslate($url, $to = 'fr') {
		if ($to != 'en') {
			$content = Moteur::http_fetch_url ( $url );
			$p_lang = strpos ( $content, 'p-lang' );
			$startPos = strpos ( $content, 'http://' . $to . '.wikipedia.org/wiki/', $p_lang );
			if ($startPos > 0) {
				$link = substr ( $content, $startPos, 100 );
				$link = substr ( $link, 0, stripos ( $link, '"' ) );
				return $link;
			}
		}
		return $url;
	}
	
	/**
	 * Permet de récupérer la partie info du site wikipédia
	 * retourne la partie info si elle existe, sinon ''
	 * @param  $url
	 * @param  $to
	 */
	public static function getWikiInfoTranslate($url, $to = 'fr') {
		$content = Moteur::http_fetch_url ( $url );
		
		$tab_infobox = array ('infobox_v2', 'infobox', 'sinottico');
		$infobox = null;
		
		foreach($tab_infobox  as $value )
		{
			 if(strpos ( $content, $value ) !== false)
			 {
			 	$infobox = $value;
			 	break;
			 }
		}
			
		if(isset($infobox))
		{
			$wikiStart = strpos ( $content, $infobox) - 14;
			$endPos = strpos ( $content, '</table>', $wikiStart + 1000 );
			$wikiDiv = substr ( $content, $wikiStart, ($endPos - $wikiStart) ) . '</table>';
		
			return $wikiDiv;
		}
		return '';
	}
	
	/**
	 * Permet d'interpréter la question
	 * récupère les résultats dans un tableau
	 * @param $url
	 * @param $search
	 */
	public static function interpreter($url, $search) {
		// Convertie la question au format adéquat
		$url .= self::replaceSearch ( $search );
		$html = self::getAnswerDiv ( $url );
		$html = str_get_html ( $html );
		
		// Si question profil
		$question = $html->find ( 'div.apiprofile', 0 );
		if (is_object ( $question )) {
			$question = $html->find ( 'div.apiprofile' );
			foreach ( $question as $obj ) {
				// Informations
				$titre = $obj->find ( 'h1', 0 );
				$titre = is_object ( $titre ) ? $titre->plaintext : '';
				$detail = $obj->find ( 'p.unique_translation', 0 );
				$detail = is_object ( $detail ) ? $detail->plaintext : '';
				$item ['infos'] = array ('titre' => trim ( $titre ), 'detail' => trim ( $detail ) );
				// Liens
				$item ['liens'] = null;
				$liens = $obj->find ( 'dd' );
				
				foreach ( $liens as $lien ) {
					$href = $lien->find ( 'a', 0 );
					$href = is_object ( $href ) ? $href->href : '';
					// Lien valide
					if (strpos ( $href, "http://" ) !== false) {
						$titre = $lien->prev_sibling ()->plaintext;
						$item ['liens'] [] = array ('titre' => $titre, 'href' => $href );
					}
				}
				// Images
				$img = $obj->find ( 'div.tk_profileimage', 0 );
				$titre = is_object ( $img ) ? $img->find ( 'h2', 0 )->plaintext : '';
				$img = is_object ( $img ) ? $img->find ( 'img', 0 )->src : '';
				$item ['images'] = array ('titre' => $titre, 'img' => $img );
				// Ajoute le résultat
				$results [] = $item;
			}
			return $results;
		}
		// Si c'est une question
		$question = $html->find ( 'div.tk_object', 0 );
		$nb = 0;
		if (is_object ( $question )) {
			$question = $html->find ( 'div.tk_object' );
			foreach ( $question as $obj ) {
				// Informations
				$titre = $obj->find ( 'div.tk_common', 0 );
				$titre = is_object ( $titre ) ? $titre->plaintext : '';
				
				// Détail
				$detail = $obj->find ( 'div.tk_urs', 0 );
				$detail = is_object ( $detail ) ? $detail->plaintext : '';
				if ($detail == '') {
					// Text
					$detail = $obj->find ( 'div.tk_text', 0 );
					$detail = is_object ( $detail ) ? $detail->plaintext : '';
				}
				$item ['infos'] = array ('titre' => trim ( $titre ), 'detail' => trim ( $detail ) );
				// Liens
				$item ['liens'] = null;
				$liens = $obj->find ( 'div.tk_object_links', 0 );
				$liens = $liens->find ( 'a' );
				foreach ( $liens as $lien ) {
					$href = is_object ( $lien ) ? $lien->href : '';
					// Lien valide
					if (strpos ( $href, "http://" ) !== false) {
						$titre = $lien->plaintext;
						$item ['liens'] [] = array ('titre' => $titre, 'href' => $href );
					}
				}
				// Images
				$img = $obj->find ( 'div.tk_object_image_holder', 0 );
				$titre = is_object ( $img ) ? $img->find ( 'h2', 0 )->plaintext : '';
				$img = is_object ( $img ) ? $img->find ( 'img', 0 )->src : '';
				$item ['images'] = array ('titre' => $titre, 'img' => $img );
				// Ajoute le résultat
				$results [] = $item;
				// Top de résultats
				$nb ++;
				if ($nb > 2) {
					Controller::setError ( 'error_most_results', 'Votre recherche comporte un trop grand nombre de réponses <br/>
					Toutes les réponses ne sont pas affichées, veuillez préciser votre question...' );
					break;
				}
			}
			
			return $results;
		}
		// Réponses venant d'autres sites
		$external_answer = $html->find ( 'div.site_answerlet', 0 );
		$nb = 0;
		if (is_object ( $external_answer )) {
			$reponse = is_object ( $external_answer->find ( 'div.answer', 0 ) ) ? $external_answer->find ( 'div.answer', 0 )->plaintext : '';
			
			$reponse = explode ( 'see the full page', $reponse );
			$reponse = $reponse [0];
			
			$item ['infos'] = array ('titre' => 'Réponse possible', 'detail' => trim ( $reponse ) );
			$item ['images'] = array ('titre' => '', 'img' => '' );
			// TODO : trouver un moyen plus élégant d'enlever le lien
			$results [] = $item;
			
			return $results;
		}
		// Pas de résultat
		return null;
	}
	
	/**
	 * Convertie la question au format adéquat
	 * retourne la question au bon format
	 * @param $str
	 */
	private function replaceSearch($str) {
		$str = strtolower ( $str );
		$str = str_replace ( " ", "_", $str );
		$str = str_replace ( "?", "", $str );
		
		return $str;
	}
	
	/**
	 * Permet de récupérer le flux html d'un site
	 * @param $url
	 * @param $timeout
	 * @param $userpwd
	 */
	function http_fetch_url($url, $timeout = 10, $userpwd = '') {
		$useragent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1";
		
		$ch = curl_init ( $url );
		// set user agent
		curl_setopt ( $ch, CURLOPT_USERAGENT, $useragent );
		curl_setopt ( $ch, CURLOPT_TIMEOUT, $timeout );
		curl_setopt ( $ch, CURLOPT_CONNECTTIMEOUT, $timeout );
		curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, true );
		if ($userpwd) {
			curl_setopt ( $ch, CURLOPT_USERPWD, $userpwd );
		}
		$data = curl_exec ( $ch );
		curl_close ( $ch );
		
		return $data;
	}
}

?>